define(["jquery"], function ($) {

    function Utils() {

    }


    Utils._execDynamicMethod_ = function (funcName, args) {
        if (typeof(eval(funcName)) != "function") {
            throw 'There is not exists a function named:"' + funcName + '"';
        }

        if (!(args instanceof (Array))) {
            throw 'The arguments of function should be a array';
        }

        return this._doCall_(eval(funcName), args);
    };

    Utils._doCall_= function (fn, args) {
        return fn.apply(this, args);
    };

    /**
     * 获取函数名称
     * @param {Function} func 函数引用
     * @return {String} 函数名称
     */
    Utils.getFunctionName = function (func) {
        if (typeof func == 'function' || typeof func == 'object') {
            var name = ('' + func).match(/function\s*([\w\$]*)\s*\(/);
        }
        return name && name[1];
    };

    /**
     　　* 显示函数堆栈<br/>
     　　* 为了和Firebug统一，将trace方法添加到console对象中
     　　* @param {Function} func 函数引用
     　　* @example
     */
    Utils.trace = function () {
        if (!('console' in window)) {
            window.console = {};
        }

        if (!console.trace) {
            console.trace = function () {
                var stack = [],
                    caller = arguments.callee.caller;

                while (caller) {
                    stack.unshift(getFunctionName(caller));
                    caller = caller && caller.caller;
                }

                alert('functions on stack:' + '\n' + stack.join('\n'));
            }
        }
    };

    Utils.isArray = function (o) {
        return Object.prototype.toString.call(o) == '[object Array]';
    };

    Utils.isJSON = function (str) {
        if (typeof str == 'string') {
            try {
                var obj = JSON.parse(str);
                if (typeof obj == 'object' && obj) {
                    return true;
                }
            } catch (e) {
                return false;
            }
        }
        return false;
    };

    Utils.getUrlParam = function (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]);
        return null;
    };

    Utils.reportException = function (msg) {
        if (arguments.length > 1) {
            throw String.format(msg, arguments);
        }

        throw msg;
    };


    Utils.isObject = function (obj) {
        if (typeof obj == 'object') {
            return true;
        }
        return false;
    }
    return Utils;
});